<?php
/**
 *    收银台控制器，其扮演的是收银员的角色，你只需要将你的订单交给收银员，收银员按订单来收银，她专注于这个过程
 */
class CashierApp extends ShoppingbaseApp
{
    /**
     *    根据提供的订单信息进行支付
     */
    function index()
    {
        /* 外部提供订单号 */
        $order_id = isset($_GET['order_id']) ? $_GET['order_id'] : 0;
        if (!$order_id){
            $this->show_warning('no_such_order');
            return;
        }
		//过滤掉没用的无效的ID号出来吧,黑客真麻烦
		$order_ids = $this->explode_function(1,$order_id);
		if (!$order_ids){
			$this->show_warning('no_such_order');
			return;			
		}	
				
        /* 判断订单的有效性 */
        $order_model =& m('order');
		$conditions = "order_id in({$order_ids}) AND buyer_id=" . $this->visitor->get('user_id');
		$order_info = $order_model->find(array('conditions'    => $conditions,));
		if (empty($order_info)){
            $this->show_warning('no_such_order');
            return;
        }
		$payment_code = '';
		foreach ($order_info as $order_info_s)
		{
			/* 订单有效性判断 */
			if ($order_info_s['status'] != ORDER_PENDING && $order_info_s['out_trade_sn'])
			{
				$this->show_warning('编号为'.$order_info_s['order_sn'].'订单已经付过款了');
				return;
			}
			$order_total_amount +=  $order_info_s['order_amount'];
			$select_store_ids[] = $order_info_s['order_id'];//取出有效的店铺的ID号出来
			$cashier_payment_code = $order_info_s['payment_code'];//取出支付方式
		}
		
		$this->assign('select_store_ids', implode(',',$select_store_ids));
		$this->assign('order_total_amount', $order_total_amount);//订单总额
		$this->assign('order_num', count($order_info));//订单笔数
		$this->assign('order_id', $order_id);//支付的订单ID号
		$this->assign('order', $order_info);
		
		//如果是货到付款的话，就没必要显示其他的了
		if ($cashier_payment_code == 'cod')
		{
			$this->_config_seo('title', '感谢您的订购 - ' . Conf::get('site_title'));
			$this->display('cashier.payform.html');	//货到付款页面					
		}
		else
		{
			//我的可用余额-------------------------------
			$my_money_mod =& m('my_money');
			$my_money=$my_money_mod->getRow("select money,zf_pass from {$my_money_mod->table} where user_id='{$this->visitor->get('user_id')}'");	
			//判断我的可用余额是否足免来支付订单
			if( $my_money['money'] )//余额大于0者
			{
				if( $my_money['money'] >= $order_total_amount)
				{
					$my_money['balance_payment'] = 'ok';//您有足够的余额来支付订单，所以显示可用余额支付
				}else{
					$my_money['differ_amount'] = round($order_total_amount-$my_money['money'],2);//还差多少钱，使用网银充值
				}
			}
			$this->assign('my_money', $my_money);			
			$this->_config_seo('title', '请支付您的订单 - ' . Conf::get('site_title'));
			$this->display('cashier.payment.html');			
		}

    }
	
	//承担去支付平台的接口，你把订单信息、支付方式给我，我来判断应该去哪里
	function payment()
	{
		//pay_step 1=订单付款,2=充值,3=余额付款
		$pay_step = isset($_GET['pay_step']) ? $_GET['pay_step'] : 0;
		
        if (!$pay_step)
        {
            $this->show_warning('no_such_order');
            return;
        }
	switch ($pay_step)
    {
		case 1://订单付款------------------------------------------------------------------////////////////////////////
		
			$use_account = isset($_POST['use_account']) ? $_POST['use_account'] : 0;//用帐户余额一起支付
			$order_id = isset($_POST['order_id']) ? $_POST['order_id'] : 0;//支付订单的ID号
			$ebank_type = $_POST['ebank_type'];
			if (!$order_id)
			{
				$this->show_warning('no_such_order');
				return;
			}
			if (empty($ebank_type))
			{
                $this->show_warning('请选择支付银行'); 
                return;
			}				
			//过滤掉没用的无效的ID号出来吧,黑客真麻烦
			$order_ids = $this->explode_function(1,$order_id);
			if (!$order_ids)
			{
				$this->show_warning('no_such_order');
				return;			
			}	
			//取出订单的各类信息---//
			$order_model =& m('order');
			$conditions = "order_id in({$order_ids}) AND buyer_id=" . $this->visitor->get('user_id');
			$order_info = $order_model->find(array('conditions' => $conditions,'fields'  => 'order_sn,order_amount,status,out_trade_sn',));
			
			if (empty($order_info))
			{
				$this->show_warning('no_such_order');
				return;
			}
			foreach ($order_info as $order_info_s)
			{
				/* 订单有效性判断 */
				if ($order_info_s['status'] != ORDER_PENDING && $order_info_s['out_trade_sn'])
				{
					$this->show_warning('编号为'.$order_info_s['order_sn'].'订单已经付过款了');
					return;
				}				
				$order_total_amount +=  $order_info_s['order_amount'];
			}
			//判断是否用余额一起来支付订单
			$use_amount = 0;
			if ($use_account == 1)
			{
				$my_money_mod = & m('my_money');
				$my_money=$my_money_mod->getOne("select money from {$my_money_mod->table} where user_id='{$this->visitor->get('user_id')}'");	
				if($my_money > 0)
				{
					$order_total_amount = round($order_total_amount-$my_money,2);
					$use_amount = 1;
				}
			}
			if ($order_total_amount <= 0)
			{
				$this->show_warning('支付金额不能小于0，请重新操作'); 
				return;
			}
			//添加日志
			$my_moneylog =& m('my_moneylog');
			$gen_order_sn = $this->_gen_order_sn();
			if ($use_account == 1)
			{
				$log_text = $this->visitor->get('user_name').'支付订单,余额'.$my_money.'元+充值'.$order_total_amount.'元';
			}else{
				$log_text = $this->visitor->get('user_name').'支付订单'.$order_total_amount.'元';
			}
			
			$add_mymoneylog=array(
				'user_id'=>$this->visitor->get('user_id'),
				'user_name'=>$this->visitor->get('user_name'),
				'bank_name'=>$ebank_type,
				'add_time'=>gmtime(),
				'leixing'=>20, //订单支出	
				'money'=>$order_total_amount,
				'log_text'=>$log_text,		
				's_and_z'=>2,//收入1,支出2	
				'pay_order_sn'=> $gen_order_sn,//生成支付订单
				'pay_which_order'=> $order_ids,//合并付款的所有订单号
				'use_amount'=> $use_amount,//是否使用余额付款0不是,1是
			);
			$id=$my_moneylog->add($add_mymoneylog);
			if ($my_moneylog->has_error())
			{
				$this->show_warning($my_moneylog->get_error());
				return;
			}	
			$data_order = array(
			      'out_trade_no'  => $gen_order_sn,
				  'pay_bank'      => $ebank_type == 'alipay' ? 'alipay' : $ebank_type,
				  'subject'       => 'dingdan-'.'user-'.$id,
				  'body'          => 'dingdan:'.$order_total_amount,
				  'total_fee'     => $order_total_amount,
			 );			 
			 $this->alipayto($data_order);					
			//print_r($data_order);
		
		  break;
        case 2://充值付款，与订单付款-------------------------------------------------------------/////////////////////////
		
			$id = isset($_GET['id']) ? $_GET['id'] : 0;//编号
			if (!$id)
			{
				$this->show_warning('no_such_order');
				return;
			}			
			$ck_my_money = $this->has_moneylog($id);
			if (!$ck_my_money)
			{
				$this->show_warning('抱歉，订单号无效或者该订单已经付过款了，请刷新后重新操作'); 
				return;
			}
			if ($ck_my_money['money'] <= 0)
			{
				$this->show_warning('支付金额不能小于0，请重新操作'); 
				return;
			}
			//判断到底是充值、还是订单的
			if($ck_my_money['leixing'] == 20){
				$leixing = 'dingdan';
			}else{
				$leixing = 'chongzhi';
			}
			$data_order = array(
			      'out_trade_no'  => $ck_my_money['pay_order_sn'],
				  'pay_bank'      => $ck_my_money['bank_name'],
				  'subject'       => $leixing.'-user-'.$ck_my_money['id'],
				  'body'          => $leixing.':'.$ck_my_money['money'],
				  'total_fee'     => $ck_my_money['money'],
			 );			 
			 $this->alipayto($data_order);

		 break;
       case 3://余额付款---------------------------------------------------------------//////////////////////////////
			
			$my_money_mod =& m('my_money');
			$order_model =& m('order');
			
			$password = isset($_POST['password']) ? $_POST['password'] : '';
			$order_id = isset($_POST['order_id']) ? $_POST['order_id'] : 0;
			if (!$order_id)
			{
				$this->show_warning('no_such_order');
				return;
			}
			//过滤掉没用的无效的ID号出来吧,黑客真麻烦
			$order_ids = $this->explode_function(1,$order_id);
			if (!$order_ids)
			{
				$this->show_warning('no_such_order');
				return;			
			}	
			if (empty($password))
			{
				$this->show_warning('请输入支付密码');
				return;	
			}
			//读原始密码
			$my_money=$my_money_mod->getRow("select zf_pass,money from {$my_money_mod->table} where user_id='{$this->visitor->get('user_id')}'");
			if (empty($my_money['zf_pass']))
			{
				$this->show_warning('您还没设置支付密码，无法支付','设置支付密码','index.php?app=my_money&act=setpaypassword'); 
				return;	
			}	
			//转换32位 MD5
			$md5zf_password=md5($password);	
			if($md5zf_password != $my_money['zf_pass'])
			{
				$this->show_warning('支付密码错误，请重新输入'); 
				return;
			}	
			//判断订单是否已经支付过了
			$conditions = "order_id in({$order_ids}) AND buyer_id=" . $this->visitor->get('user_id');
			$order_info = $order_model->find(array('conditions' => $conditions));
						
			if (empty($order_info))
			{
				$this->show_warning('no_such_order');
				return;
			}
			foreach ($order_info as $order_info_s)
			{
				/* 订单有效性判断 */
				if ($order_info_s['status'] != ORDER_PENDING && $order_info_s['out_trade_sn'])
				{
					$this->show_warning('编号为'.$order_info_s['order_sn'].'订单已经付过款了');
					return;
				}
				$order_total_amount +=  $order_info_s['order_amount'];
			}
			//如果总金额为0元，则无法支付
			if ( $order_total_amount <= 0)
			{
				$this->show_warning('订单总金额小于等于0，无法支付');
				return;
			}			
			if ($my_money['money'] < $order_total_amount)
			{
				$this->show_warning('您的帐户余额不足，无法支付订单');
				return;
			}
			
			//所有判断通过，可以更新订单和减少帐户余额了						
			$order_edit_array=array('money'=>$my_money['money']-$order_total_amount);
			$my_money_mod->edit('user_id='.$this->visitor->get('user_id'), $order_edit_array);
			//添加扣除金额的日志
			$log_text =$this->visitor->get('user_name').'余额支付订单'.$order_total_amount.'元';
			$add_mymoneylog=array(
				'user_id'=>$this->visitor->get('user_id'),
				'user_name'=>$this->visitor->get('user_name'),
				'bank_name'=>'yue',//余额支付
				'add_time'=>gmtime(),
				'leixing'=>20, //订单支出	
				'caozuo'=>1, //状态已完成	
				'money'=>$order_total_amount,
				'money_yue'=>$order_edit_array['money'],//余额
				'log_text'=>$log_text,		
				's_and_z'=>2,//收入1,支出2	
			);
			$my_moneylog_mod =& m('my_moneylog');
			$my_moneylog_mod->add($add_mymoneylog);	
			//通过检验，更新订单为已付款
			$ebank_type_check = Lang::get('ebank_type');//银行信息
			$order_edit_array=array(
				'status'=> ORDER_ACCEPTED,//已付款，待发货的状态
				'payment_name'  =>$ebank_type_check['yue'],
				'payment_code'  =>'yue',
				'pay_time' =>gmtime(),
				'out_trade_sn'=>gmtime(),
			);
			$order_model->edit($conditions,$order_edit_array);				

            //多封邮件一起发出去
			$model_member =& m('member');
			foreach ($order_info as $order_info_s)
			{
				//取出卖家邮箱地址
				$seller_email  = $model_member->getOne("select email from {$model_member->table} where user_id='{$order_info_s['seller_id']}'");
				 /* 发送给卖家发货的通知 */
				$seller_mail = get_mail('toseller_online_pay_success_notify', array('order' => $order_info_s));
				$this->_mailto($seller_email, addslashes($seller_mail['subject']), addslashes($seller_mail['message']));
			}
            $this->assign('leixing', '1000');
			$this->assign('total_fee', $order_total_amount);
			$this->_curlocal(LANG::get('pay_successed'));
			$this->display('paynotify.index.html');
			
		  break;
	   default:
            $this->show_warning('no_such_order');
            return;			
	 }
		
	}
	
	//判断是否为正确的充值ID号
	function has_moneylog($id)
	{
		$this->my_moneylog_mod =& m('my_moneylog');
		$my_moneylog=$this->my_moneylog_mod->get(array('conditions' => "id='$id'"));	
		if ($my_moneylog)
		{
			if ($my_moneylog['caozuo'])
			{
				return false;
			}
			if (!$my_moneylog['pay_order_sn'])
			{
				return false;
			}					
		}
		return $my_moneylog;
	}

	
	//支付商品订单的时候，过滤掉无效的ID号,黑客真让人郁闷
	function explode_function($type=0,$store_id)
	{
		$store_ids = explode(',', $store_id);
		$araay_ids = array();
		foreach ($store_ids as $key => $storeids)
		{
			if (is_numeric($storeids))
			{
				$araay_ids[] = intval($storeids);
			}
		}
		if ($type) $araay_ids = implode(',',$araay_ids);
		return $araay_ids;
	}
    /**
     *    生成订单号
     */
    function _gen_order_sn()
    {
        /* 选择一个随机的方案 */
        mt_srand((double) microtime() * 1000000);
        $timestamp = gmtime();
        $y = date('y', $timestamp);
        $z = date('z', $timestamp);
        $order_sn = $y . str_pad($z, 3, '0', STR_PAD_LEFT) . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);

        $model_order =& m('my_moneylog');
        $orders = $model_order->find('pay_order_sn=' . $order_sn);
        if (empty($orders))
        {
            /* 否则就使用这个订单号 */
            return $order_sn;
        }

        /* 如果有重复的，则重新生成 */
        return $this->_gen_order_sn();
    }	
	
	//转去支付宝付款
	function alipayto($data_order)
	{
		if (!$data_order)
		{
		  $this->show_warning('操作错误，请联系客服解决');
		  return;				
		}

		require_once(ROOT_PATH . "/includes/alipay/alipay.config.php");
		require_once(ROOT_PATH . "/includes/alipay/lib/alipay_service.class.php");

		//必填参数//
		
		//请与贵网站订单系统中的唯一订单号匹配
		$out_trade_no = $data_order['out_trade_no'];
		//订单名称，显示在支付宝收银台里的"商品名称"里，显示在支付宝的交易管理的"商品名称"的列表里。
		$subject      = $data_order['subject'];
		//订单描述、订单详细、订单备注，显示在支付宝收银台里的"商品描述"里
		$body         = $data_order['body'];
		//订单总金额，显示在支付宝收银台里的"应付总额"里
		$total_fee    = $data_order['total_fee'];
		
		//扩展功能参数——默认支付方式//
		
		//默认支付方式，取值见"即时到帐接口"技术文档中的请求参数列表
		$paymethod    = '';
		//默认网银代号，代号列表见"即时到帐接口"技术文档"附录"→"银行列表"
		$defaultbank  = '';
		
		if ($data_order['pay_bank'] == 'alipay'){
			$paymethod = 'directPay';
		}else {
			$paymethod = 'bankPay';
			$defaultbank = $data_order['pay_bank'];
		}		
		//扩展功能参数——防钓鱼//
		
		//防钓鱼时间戳
		$anti_phishing_key  = '';
		//获取客户端的IP地址，建议：编写获取客户端IP地址的程序
		$exter_invoke_ip = '';
		
		//扩展功能参数——其他//
		
		//商品展示地址，要用 http://格式的完整路径，不允许加?id=123这类自定义参数
		$show_url			= 'http://www.moonyes.com';
		//自定义参数，可存放任何内容（除=、&等特殊字符外），不会显示在页面上
		$extra_common_param = '';
		
		//扩展功能参数——分润(若要使用，请按照注释要求的格式赋值)
		$royalty_type		= "";			//提成类型，该值为固定值：10，不需要修改
		$royalty_parameters	= "";
		/************************************************************/
		
		//构造要请求的参数数组
		$parameter = array(
				"service"			=> "create_direct_pay_by_user",
				"payment_type"		=> "1",
				
				"partner"			=> trim($aliapy_config['partner']),
				"_input_charset"	=> trim(strtolower($aliapy_config['input_charset'])),
				"seller_email"		=> trim($aliapy_config['seller_email']),
				"return_url"		=> trim($aliapy_config['return_url']),
				"notify_url"		=> trim($aliapy_config['notify_url']),
				
				"out_trade_no"		=> $out_trade_no,
				"subject"			=> $subject,
				"body"				=> $body,
				"total_fee"			=> $total_fee,
				
				"paymethod"			=> $paymethod,
				"defaultbank"		=> $defaultbank,
				
				"anti_phishing_key"	=> $anti_phishing_key,
				"exter_invoke_ip"	=> $exter_invoke_ip,
				
				"show_url"			=> $show_url,
				"extra_common_param"=> $extra_common_param,
				
				"royalty_type"		=> $royalty_type,
				"royalty_parameters"=> $royalty_parameters
		);
		
		//构造即时到帐接口
		$alipayService = new AlipayService($aliapy_config);
		$html_text = $alipayService->create_direct_pay_by_user($parameter);
		echo $html_text;
	}
	
}
?>